package com.example.springboot_mail.service;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import java.io.File;

/**
 * 邮件发送服务类
 * 用于封装纯文本邮件的发送逻辑，通过Spring的JavaMailSender实现邮件发送功能
 */
@Service  // 标记为Spring服务类，使其被Spring容器管理，可被其他组件注入使用
public class SendEmailService {

    /**
     * 注入JavaMailSender对象
     * 由Spring Boot自动配置（基于application.yml中的邮件服务器配置）
     * 提供邮件发送的核心功能，封装了SMTP协议交互细节
     */
    @Autowired
    private JavaMailSender mailSender;

    /**
     * 从配置文件中读取发件人邮箱地址
     * 对应application.yml中的spring.mail.username配置项
     * 确保与邮件服务器认证的账号一致，否则可能导致发送失败
     */
    @Value("${spring.mail.username}")
    private String username;

    /**
     * 发送纯文本邮件
     * @param to 收件人邮箱地址（支持单个地址，若需多个收件人可使用String[]数组）
     * @param subject 邮件主题（标题）
     * @param text 邮件正文内容（纯文本格式，不支持HTML）
     */
    public void sendSimpleEmail(String to, String subject, String text) {
        // 创建简单邮件消息对象，用于封装邮件的基本信息
        SimpleMailMessage message = new SimpleMailMessage();

        // 设置发件人地址（必须与配置文件中的spring.mail.username一致）
        message.setFrom(username);
        // 设置收件人地址
        message.setTo(to);
        // 设置邮件主题
        message.setSubject(subject);
        // 设置邮件正文
        message.setText(text);

        try {
            // 调用JavaMailSender发送邮件
            mailSender.send(message);
            System.out.println("纯文本邮件发送成功");
        } catch (Exception e) {
            // 捕获发送过程中的异常（如网络错误、认证失败、格式错误等）
            System.out.println("纯文本邮件发送失败：" + e.getMessage());
            // 打印异常堆栈信息，便于排查具体错误原因
            e.printStackTrace();
        }

    }


    /**
     * 发送复杂邮件（支持HTML正文、内嵌图片、附件）
     * 解决HTML正文不渲染、内嵌图片不显示的问题
     *
     * @param to             收件人邮箱地址
     * @param subject        邮件主题
     * @param htmlText       HTML格式的正文内容（需包含完整HTML标签）
     * @param attachmentName 附件在邮件中显示的名称
     * @param rscId          内嵌资源的唯一标识（与HTML中cid对应）
     * @param rscPath        内嵌资源（如图片）的本地文件路径
     * @param attachmentPath 附件的本地文件路径
     */
    public void sendComplexEmail(String to, String subject, String htmlText,
                                 String attachmentName, String rscId, String rscPath, String attachmentPath) {
        // 创建MimeMessage对象，用于处理复杂邮件（支持多部分内容：正文、图片、附件）
        MimeMessage mimeMessage = mailSender.createMimeMessage();

        try {
            // 创建MimeMessageHelper辅助类，开启多部分模式（true）并指定UTF-8编码
            // 多部分模式是支持附件和内嵌资源的前提
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");

            // 设置发件人（必须与配置文件中的username一致）
            messageHelper.setFrom(username);
            // 设置收件人
            messageHelper.setTo(to);
            // 设置邮件主题
            messageHelper.setSubject(subject);

            // 关键修正1：启用HTML解析
            // 第二个参数设为true，表示正文是HTML格式，邮件客户端会渲染标签而非显示源码
            messageHelper.setText(htmlText, true);

            // 关键修正2：关联内嵌图片（与HTML中的cid对应）
            if (rscId != null && !rscId.isEmpty() && rscPath != null && !rscPath.isEmpty()) {
                // 加载本地图片资源
                FileSystemResource imageResource = new FileSystemResource(new File(rscPath));
                // 用addInline方法将图片与rscId绑定，HTML中通过src='cid:rscId'引用
                // 注意：rscId必须与HTML中的cid值完全一致（如"img001"）
                messageHelper.addInline(rscId, imageResource);
            }

            // 添加附件（可选）
            if (attachmentPath != null && !attachmentPath.isEmpty() && attachmentName != null) {
                FileSystemResource attachmentResource = new FileSystemResource(new File(attachmentPath));
                messageHelper.addAttachment(attachmentName, attachmentResource);
            }

            // 发送邮件
            mailSender.send(mimeMessage);
            System.out.println("复杂邮件发送成功（HTML+内嵌图片+附件）");

        } catch (MessagingException e) {
            System.out.println("复杂邮件发送失败：" + e.getMessage());
            throw new RuntimeException(e);
        }
    }

    /**
     * 发送支持HTML格式的邮件（可用于模板邮件场景）
     * 该方法通过MimeMessage实现HTML内容渲染，适用于包含富文本、样式的邮件
     *
     * @param to      收件人邮箱地址（单个地址，多收件人可使用String[]数组）
     * @param subject 邮件主题（标题）
     * @param content 邮件正文内容（支持HTML标签，如&lt;h1&gt;&lt;p&gt;&lt;img&gt;等）
     */
    public void sendTemplateEmail(String to, String subject, String content) {
        // 创建MimeMessage对象，用于处理复杂邮件（支持HTML、附件等多部分内容）
        MimeMessage message = mailSender.createMimeMessage();

        try {
            // 创建MimeMessageHelper辅助类，参数说明：
            // - message：要处理的MimeMessage对象
            // - true：启用多部分模式（multipart），支持HTML内容和附件（即使即使暂不添加附件，开启此模式更通用）
            MimeMessageHelper helper = new MimeMessageHelper(message, true);

            // 设置发件人地址（必须与配置文件中的spring.mail.username一致，否则可能触发邮件服务器认证失败）
            helper.setFrom(username);

            // 设置收件人地址
            helper.setTo(to);

            // 设置邮件主题
            helper.setSubject(subject);

            // 设置邮件正文，参数说明：
            // - content：邮件内容字符串（可包含HTML标签）
            // - true：告知邮件客户端该内容为HTML格式，需要解析标签渲染样式
            helper.setText(content, true);

            // 调用邮件发送器发送邮件
            mailSender.send(message);

            // 打印发送成功日志，便于调试和监控
            System.out.println("模板邮件发送成功");

        } catch (MessagingException e) {
            // 捕获邮件构建或发送过程中的异常（如格式错误、网络问题、认证失败等）
            // 包装为RuntimeException抛出，避免方法声明明受检异常，简化调用方处理逻辑
            throw new RuntimeException("邮件发送失败：" + e.getMessage(), e);
        }
    }


}